home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-09-13 | 45.6 KB | 1,213 lines |
-
-
- ; ------ Flederfanten --------------------
- ; Das Flederfantenmodul für TwiLight.
- ; © 1993 by Delirium Arts
- ;
- ; Dieses Modul soll helfen, die Spriteroutine zu erklären
- ; Es wurde geschrieben mit dem TurboAss von Σ-Soft
- ; Einige Eigenheiten des TurboAss:
- ; PART / ENDPART:
- ; Die Bereiche, die zwischen Part und Endpart
- ; Stehen, lassen sich mit dem TurboAss mit einem
- ; Klick zu einer Zeile zusammenfassen. Dies dient
- ; der Übersichtlichkeit von Programmen.
- ; Bei einem Assembler, der dies nicht versteht,
- ; kann man die Parts und Endparts einfach streichen.
- ; Labelnamen länger als 8 Zeichen und Umlaute:
- ; Hat Ihr Assembler damit Probleme, müssen sie sie
- ; leider umändern...
- ;
- ; Das Programm enthält im unteren Teil ein paar Unterroutinen,
- ; die in diesem Modul nicht gebraucht werden. Mit Ihnen können Sprites beim Konvertieren
- ; gespiegelt werden, sowie extra Masken nachgeladen werden.
- ; Allerdings sind diese, wie eigentlich das ganze Modul, nicht besonders optimiert.
-
-
-
- OUTPUT 'C:\TLM\ELEFANT.TLM' ; Modul wird im Ordner TLM als ELEFANT.TLM gespeichert
-
- >PART 'ACC-Struktur-EQUs'
- _tl_version EQU 0 ; die infos, die das ACC liefert...
- _tl_handle EQU 2 ; siehe Doku!
- _max_x EQU 4
- _max_y EQU 6
- _vscr_x EQU 8
- _vscr_y EQU 10
- _vscr_w EQU 12
- _vscr_h EQU 14
- _max_colors EQU 16
- _palette EQU 18
- _planes EQU 20
- _raster_op EQU 22
- _cpu EQU 24
- _fpu EQU 28
- _mch EQU 32
- _snd EQU 36
- _tl_reserved EQU 40
- _tl_path EQU 44
- _tl_screen_adr EQU 48
- _tl_mem EQU 52
- _tl_aes_global EQU 56
- _tl_vdi_pb EQU 60
- _tl_flags EQU 64
- _tl_check EQU 66
- _tl_dim_col EQU 70
- _tl_mod_time EQU 74
- _tl_set_col EQU 78
- _tl_scrn_restore EQU 82
- _tl_wait EQU 86
- _tl_snd_play EQU 90
- _tl_snd_stop EQU 94
- _tl_reserved2 EQU 98
- _tl_play_mouse EQU 110
- _tl_scroll EQU 114
- _tl_xset_col EQU 118
- _tl_dither EQU 122
- _tl_sprite_init EQU 126
- _tl_sprite EQU 130
- _tl_convert EQU 134
-
-
- screen EQU 0
- colors EQU 1
- vsyncs EQU 2
-
-
- RAHMEN EQU 0
- STRING EQU 1
- BUTTON EQU 2
- RADIO EQU 3
- POPUP EQU 4
- SLIDER EQU 5
- ICON EQU 6
- EX_BUTTON EQU 10
- POPUP_2 EQU 11
- FREI EQU 12
-
-
-
-
- ENDPART
- >PART 'GEMDOS-EQUs'
- Fcreate EQU 60
- Fclose EQU 62
- Fopen EQU 61
- Fread EQU 63
- Fseek EQU 66
- Fwrite EQU 64
- Fsetdta EQU 26
- Fsfirst EQU 78
- Fsnext EQU 79
- Pexec EQU 75
- Mshrink EQU 74
- Mfree EQU 73
- Malloc EQU 72
- ENDPART
-
- >PART 'Modulkopf'
- bra modulstart ; muß ein 4-Byte-Sprung sein!
- tl_macic: DC.B "XTLM"
- version: DC.W $10 ; Version 0.1
- min_acc_vers: DC.W 0
- DXSET 24," "
- name: DX.B 'Flederfanten'
- author: DX.B 'Delirium Arts'
-
- icon: DC.W $1F,$F000,$01FF,$FF00
- DC.W $07E7,$FFC0,$0FD9,$FFE0
- DC.W $1FFE,$FFF0,$1FFF,$7FF8
- DC.W $3CFF,$7FF8,$3CFF,$7FFC
- DC.W $3FFF,$7FFC,$7FFF,$7FF4
- DC.W $7FFE,$FFF4,$7FFE,$FFF2
- DC.W $7FFD,$FFF2,$7FF3,$FFF2
- DC.W $7FFF,$FFF2,$7EFF,$FFF2
- DC.W $38FF,$FFE0,$38FF,$FFE0
- DC.W $18FF,$FFE0,$1CF9,$E7C0
- DC.W $0CF8,$07C0,$0CF8,$07C0
- DC.W $F8,$07C0,$F8,$07C0
-
-
-
-
-
- mem_request: DC.L 0 ; Speicheranforderung...
- flags:
- DC.W %1110111 ; Modul braucht Spriteroutine verändert Farben und Hintergrund.
- DC.L objekte
-
- objekte: DC.W ob_ende-objekte
- DC.L 0
- DC.L infotext
- DC.W 4
- DC.L objekte_rahmen
- DC.L farb_pop
- DC.L schwarz_weiß
- DC.L Sync
-
-
- objekte_slider: DC.W SLIDER ; SLIDER (wo sind die EQUs???"
- DC.W 3 ; tastaturbedienbar, horizontal
- DC.L slider_routine
- D_anz: DC.W 5 ; Default: 11 Objekte
- DC.W 1,1 ; Position
- DC.W 28 ; breit
- DC.W 15 ; 14 Elemente
- DC.W 1
- DC.W 1
- DC.W 15
- DC.L sl_mask
- DC.L sl_text
- sl_mask: DC.B "__ Flederfanten",0
- sl_text: DC.B " ",0
-
- schwarz_weiß: DC.W BUTTON
- DC.W 0
- DC.L 0
- D_sw: DC.W 0
- DC.W 1
- DC.W 7
- DC.L sw_txt
-
-
- Sync: DC.W BUTTON
- DC.W 0
- DC.L 0
- D_vsync: DC.W -1
- DC.W 1
- DC.W 9
- DC.L sync_txt
-
-
-
-
- objekte_rahmen: DC.W RAHMEN
- DC.W 0,1,32,3
- DC.L obj_txt
- DC.W 1
- DC.L objekte_slider
-
-
- farb_pop: DC.W POPUP
- DC.W 0
- DC.L 0
- D_farbe: DC.W 1
- DC.W 0,5
- DC.L farb_txt
- DC.W 7 ; 7 Paletten
- DC.L farbtexte
-
-
- ob_ende: DC.L -1
-
-
- sw_txt: DC.B "Schwarz-[Weiß darstellen",0
- sync_txt: DC.B '[Bildsyncronisation',0
- obj_txt: DC.B ' Zahl der Flederfanfen ',0
- farb_txt: DC.B '[Flederfantenfarbe: ',0
- farbtexte: DC.B ' Grau ',0
- DC.B ' Lila ',0
- DC.B ' Blau ',0
- DC.B ' Rosa ',0
- DC.B ' Grün ',0
- DC.B ' Violett ',0
- DC.B ' Gelb ',0
- EVEN
-
- farbpaletten: DC.L grau
- DC.L lila
- DC.L blau
- DC.L rosa
- DC.L grün
- DC.L violett
- DC.L gelb
-
-
-
- infotext:
- DC.B " Die Flederfanten",13,13
- DC.B " Einstellbar ist ihre Zahl",13
- DC.B " Auch ihre Farbe steht zur Wahl",13
- DC.B " Und ihr einziges bestreben",13
- DC.B " Ist's von rechz nach linx zu schweben",13
- DC.B " Ihre Herkunft ist ungeklärt",13
- DC.B " Und doch flattern sie unbeschwert",13
- DC.B " Damit sich diese Wesen regen",13
- DC.B " Einfach die Maus mal nicht bewegen",13,0
-
- EVEN
-
-
-
- slider_routine: cmpi.w #1,D_anz
- bne.s mehr_fleder
- move.b #" ",sl_text+12
- move.b #" ",sl_text+13
- rts
- mehr_fleder:
- rts
-
- ENDPART
- >PART 'Objektausmaße'
-
-
- b_e1 EQU 112 ; Breite des Elefanten
- h_e1 EQU 76 ; Höhe des Elefanten
- l_e1 EQU b_e1/8*h_e1 ; Länge eines Elefanten
-
-
- l_ges EQU l_e1*7 ; Länge von 7 Animationsstufen
-
- ENDPART
-
-
- modulstart: >PART 'Modulstart etc.'
- ; Definitionen:
- ; A6: Variablenpointer
-
- BASE A6,varbase ; A6 wird als Variablenpointer initialisiert
- lea varbase(PC),A6
- move.l A0,tl_info(A6) ; Die tl_info Struktur speichern
- move.w _tl_handle(A0),vdi_handle(A6) ; handle eintragen
- move.l _tl_check(A0),tl_check(A6)
- move.l _tl_sprite(A0),tl_sprite(A6)
- move.l _tl_dither(A0),tl_dither(A6)
- move.l _vscr_x(A0),vscr_x(A6)
- move.l _vscr_w(A0),vscr_w(A6)
- move.w _max_colors(A0),max_colors(A6)
- move.l SP,stackpointer(A6) ; Stackpointer sichern für's rausspringen
- ENDPART
- init: >PART 'konvertiert objekte'
- ; Einsprung: nichts
-
- bsr tst_farbe ; Testet, ob Farbe oder Monochrom. Besetzt D3 (Flag, ob Farbe oder Monochrom) richtig
- lea bilder_pfad(A6),A1 ; Zeiger auf den Pfad der Bilder
- bsr datei_pfad ; bastelt den Pfad zusammen
- move.w D_anz(A6),anz_objekte(A6) ; wieviele Flederfanten überhaupt
- subq.w #1,anz_objekte(A6) ; wegen DBRA und so...
- move.l #l_ges,D7 ; Soviel Speicher brauchen alle gemeinsam für 1 Plane
- move.w #b_e1+32,D5 ; breitestes Objekt+ maximale Verscjiebung um 32 Pixel
- move.w #h_e1+10,D6 ; höchstes Objekt+ maximale y-Verschiebung um 10 Pixel pro tl_sprite aufruf
- moveq #0,D4 ; Flag: mit Maske
- bsr konvertier_speicher ; Fordert den nötigen Speicher für die Bilder an
- beq.s ende ; nicht genügend Speicher
- movea.l D0,A2 ; Anfangsadresse, des Speicherblocks
- lea ob_tree(PC),A0 ; Zeiger auf Spritestructur (noch leer)
- moveq #0,D4 ; Flag: mit Restaurieren
- bsr sprite_anmelden ; ruft tl_sprite_init() auf
- bne.s ende ; bei Fehler raus
- bsr konvertieren ; Konvertiert die Objekte
- bsr.s init_objekte ; setzt die Elefanten erstmals auf den Schirm
-
- ENDPART
- main: >PART 'eigentliche Hauptprogramm'
-
- movea.l tl_sprite(A6),A4
- movea.l tl_check(A6),A5
-
- hauptschleife: move.w anz_objekte(A6),D6 ; Anzahl der eingestellten Flederfanten-1
- schleife: move.w D6,D0 ; welche Nummer
- bsr.s do_objekt ; Flederfant bewegen
- tst.w D_vsync ; Ist synchronisation eingeschaltet?
- beq.s end_schl
- btst #0,D6 ; bei jedem 2.Flederfanten tl_check() aufrufen (mit Vsync)
- beq.s end_schl
- jsr (A5)
- bmi.s ende
-
- end_schl: dbra D6,schleife ; alle Flederfanten abarbeiten
- tst.w D_vsync ; nochmal bei bedarf einen VSYNC (und tl_check() ) aufrufen
- bne.s hauptschleife
-
- jsr (A5)
- bmi.s ende
-
- bra.s hauptschleife
-
- ENDPART
-
- ende: >PART 'zurück zu TwiLight-ACC'
-
- move.l speicher(A6),-(SP) ; hier meistens FEHLER!
- move.w #Mfree,-(SP)
- trap #1
- addq.l #6,SP
- movea.l stackpointer(A6),SP
- moveq #0,D0 ; alles OK
- rts
- ENDPART
-
- ;-------------- Unterroutinen -------------------------------
-
- init_objekte: >PART 'initialisiert Objekte erstmals'
-
- lea ob_tree(PC),A5
- move.w anz_objekte(A6),D0
- lea sprite_daten+2(A6),A1
- init_ob_schl1: move.w D0,-(SP)
- bsr posit_objekt
- move.w (SP)+,D0
- move.l A1,(A5)+
- lea 11*2(A1),A1 ; nächstes Objekt
- dbra D0,init_ob_schl1
- move.l #-1,(A5)+
- rts
- ENDPART
-
- do_objekt: >PART 'Zeichnet ein Objekt'
- ; Einsprung: D0 Nummer des Objekts, das getestet wird, ob es außerhalb des Bereichs ist
- ; A4 Zeiger auf Spriteroutine
- ; Es wird ein neues Objekt initialisiert
-
-
- ; Einsprung für Set Objekt:
- ; A1 Zeiger, wohin das neue Objekt zusammengebastelt wird
-
- move.w D0,-(SP) ; welcher Flederfant
- jsr (A4) ; tl_sprite()
- movea.l D0,A1 ; Die Überschneidungsstruktur nach A1
- move.w (SP)+,D0 ; Nummer wieder zurück und Stackkorrektur
- tst.w (A1) ; 1. Word testen: Ist der Flederfant noch auf dem Schirm?
- beq do_objekt_ausspr ; Ja, Objekt ist gut sichtbar, also wieder zurück zur Aufrufenden Routine
-
- lea ob_tree(A6),A0 ; Flederfant ist außerhalb.
- ; Dies kann 2 Gründe haben:
- ; 1. Flederfant hat den Schirm verlassen
- ; 2. Flederfant ist noch garnicht in den Schirm geflogen
- lsl.w #2,D0 ; Nummer*4 für die Adresse des Flederfanten
- movea.l 0(A0,D0.w),A1 ; Zeigt auf die obj_struct des Flederfanten
- subq.w #1,-2(A1) ; Zähler, ob Objekt nur neu initialisiert wurde und desshalb außen ist...
- bgt.s do_objekt_ausspr ; Objekt ist auf dem Weg in den Schirm. Also alles OK, normal zurück zur aufrufenden Routine
-
- ; Einsprung A1 Zeiger, wohin der Konfigblock hinkommt...
-
- set_objekt: lea objekte_array(A6),A2
- movea.l 2(A2),A2 ; Zeigt auf die Flederfanten
- bsr random
- move.l D0,D7 ; Puffern
- move.l A2,16(A1) ; Adresse Eintragen
- move.l (A2),4(A1) ; Breite Eintragen
- and.w #%1111111,D7
- btst #1,D7 ; Entscheiden, ob der Flederfant von Oben oder von rechts kommt.
- beq.s von_rechts ; zufällig von rechts
-
- move.w vscr_w(A6),D1
- muls D7,D1
- lsr.w #7,D1 ; D1 Wert zwischen 0 und max_y
- add.w vscr_x(A6),D1
- move.w vscr_y(A6),D2
- sub.w #h_e1,D2 ; minus Höhe der Flederfanten
- bra.s set_weiter
-
- von_rechts: move.w vscr_h(A6),D2
- muls D7,D2
- lsr.w #7,D2
- add.w vscr_y(A6),D2
- move.w vscr_x(A6),D1
- add.w vscr_w(A6),D1
- set_weiter: move.w D1,(A1) ; x-Position eintragen
- move.w D2,2(A1) ; y-Position eintragen
- and.w #%11,D0
- addq.w #1,D0
- move.w D0,D1
- neg.w D0
- move.w D0,8(A1) ; Geschwindigkeit in x-Richtung
- move.w D1,10(A1) ; in y-Richtung
- moveq #4,D0 ; wie oft wechseln
- sub.w D1,D0 ; nach sovielen Aufrufen wechseln
- move.w D0,12(A1) ; wechseln nach soundsoviel mal
- move.w #50,-2(A1) ; 50 Bewegungen kann Objekt außerhalb sein, dann erst wir es gelöscht
-
- do_objekt_ausspr:rts
-
-
- ENDPART
-
- posit_objekt: >PART 'Positioniert Objekt beliebig'
- ; Einsprung: A1 Zeiger auf Objektdaten
-
- lea objekte_array(A6),A2
- movea.l 2(A2),A2 ; Zeigt auf die Flederfanten
- bsr random
- move.l D0,D7 ; Puffern
- move.l A2,16(A1) ; Adresse Eintragen
- move.l (A2),4(A1) ; Breite Eintragen
- and.w #%1111111,D7
-
- move.w vscr_w(A6),D1
- muls D7,D1
- lsr.w #7,D1 ; D1 Wert zwischen 0 und max_y
- add.w vscr_x(A6),D1
- move.w vscr_h(A6),D2
- muls D7,D2
- lsr.w #7,D2
- add.w vscr_y(A6),D2
- move.w D1,(A1) ; x-Position eintragen
- move.w D2,2(A1) ; y-Position eintragen
- and.w #%11,D0
- addq.w #1,D0
- move.w D0,D1
- neg.w D0
- move.w D0,8(A1) ; Geschwindigkeit in x-Richtung
- move.w D1,10(A1) ; in y-Richtung
- moveq #4,D0 ; wie oft wechseln
- sub.w D1,D0 ; nach sovielen Aufrufen wechseln
- move.w D0,12(A1) ; wechseln nach soundsoviel mal
- move.w #2,-2(A1) ; 2 Bewegungen kann Objekt (Flederfant) außerhalb sein, dann erst wird es gelöscht
- rts
-
- ENDPART
-
-
-
-
- tst_farbe: >PART 'testet, ob Farbig oder sw'
- ; Einsprung: nichts
- ; Aussprung: D3=0 -> Farbe D3 <>0 -> Monochrom
-
-
- movem.l D0-D2/A5,-(SP)
- moveq #0,D3 ; Nehmen wir mal an, es wird Farbe gewünscht (D3 ist das Flag dafür)
- movea.l tl_info(A6),A5
- cmpi.w #1,_planes(A5) ; nur Monochrom?
- beq.s set_sw ; es ist monochrom
- tst.w D_sw ; In Farbe SW darstellen?
- bne.s set_sw
- cmpi.w #16,max_colors(A6) ; weniger als 16 Farben?
- bge.s genügend_farben ; alles OK für Farbe
- set_sw: moveq #1,D3 ; D3 ist nun Flag für SW
- move.w #1,darstell_planes(A6) ; nur 1 Plane darstellen
- bra.s tst_farbe_ausspr
- genügend_farben:
- move.w _planes(A5),darstell_planes(A6) ; alle Planes darstellen
- tst_farbe_ausspr:movem.l (SP)+,D0-D2/A5
- rts
-
-
- ENDPART
-
- rand_3: >PART 'liefert Zahl zw 0 und 2'
-
- bsr.s random
- and.w #%1111,D0
- muls #3,D0 ; D0 *3
- lsr.w #4,D0
- lsl.w #2,D0
- rts
- ENDPART
- random: >PART 'liefert Zufallszahl in D0'
- movem.l D1-D4/A0-A4,-(SP)
- move.w #$11,-(SP)
- trap #14
- addq.l #2,SP
- movem.l (SP)+,D1-D4/A0-A4
- rts
- ENDPART
-
- konvertieren: >PART 'konvertiert die Elefanten'
- ; EInsprung: A2 Zeiger auf Speicherbereich
- ; D3 monochrom oder farbig
-
- movem.l D0-A6,-(SP)
- moveq #0,D1
- lea objekte_array(A6),A5
- clr.w (A5)+
- _flederfant: lea flederfant(PC),A0 ; Zeigt auf den ersten Flederfant
- move.l A0,(A5)+
- addq.w #1,objekte_array(A6)
- move.w (A0)+,D5 ; breite und Höhe
- move.w (A0)+,D6
- moveq #7-1,D7
- addq.l #2,A0
- fleder_schl1: bsr konvert_objekt
- move.l D0,(A0)+ ; Adresse der Daten
- bsr create_mask
- move.l D0,(A0)+
- dbra D7,fleder_schl1
- movem.l (SP)+,D0-A6
- rts
-
- ENDPART
-
-
-
-
- ;--------------- Sprite Konvertierung --------------------------
-
- >PART 'Erklärung'
- ; Es muß klar sein, ob Monochrom oder Farbig (in D3)
- ; Zuerst konvertier_speicher aufrufen. Damit hat man genügend Speicher
- ; reserviert. D0 zeigt auf den Speicherblock, wo die Objekte mal
- ; hinkommen. In unkonvert Adresse, wo die Sachen hingeladen werden.
- ;
- ; Dann sprite_anmelden aufrufen. Routine ruft hauptächlich
- ; tl_sprite_init auf.
- ;
- ; Dann jeweils konvert_objekt aufrufen. Routine lädt selbst Ojekte
- ; und konvertiert sie. In unkonvert bleiben die Originaldaten erhalten,
- ; so daß nch eine Maske erzeugt werden kann, sowie die Objekte
- ; gespiegelt werden können. Es werden nur die Daten konvertiert.
- ; Einen Objektblock (2.Structur) muß selbst erzeugt werden.
- ; Dazu steht jeweils in D0 die Adresse, wohin konvertiert, oder
- ; gespiegelt oder die Maske erzeugt wurde.
-
-
- ENDPART
- sprite_anmelden:>PART 'ruft tl_sprite_init_auf'
- ; Einsprung: in unkonvert(a6) Adresse des Speicherblocks
- ; in unkonvert_länge(a6) länge des Speichers
- ; A0 Zeiger auf Spritestructur (muß noch nichts drinnstehen)
- ; D5 Breite des Größten Objekts samt Bewegung
- ; D6 Höhe des Größten Objekts samt Bewegung
- ; D3 Farbig (0) oder monochrom
- ; D4 mit restaurieren(0) ohne (1)
-
- movea.l tl_info(A6),A5
-
-
- ; Einsprung für die Sprite_init_routine:
- ; 4(sp).l Zeiger auf Pufferspeicher
- ; 8(sp).l länge des Pufferspeichers
- ; 12(sp).l Zeiger auf die Objekte struktur
- ; 16(sp).w x-Breite des größten Objekts
- ; 18(sp).w y-Breite des größten Objekts
- ; 20(sp).w Farbig (0) monochrom (1)
- ; 21(sp).w mit restaurieren (0), ohne restaurieren (1)
- move.w D4,-(SP)
- move.w D3,-(SP)
- move.w D6,-(SP) ; Höhe
- move.w D5,-(SP) ; Breite
- move.l A0,-(SP)
- move.l unkonvert_länge(A6),-(SP)
- move.l unkonvert(A6),-(SP)
- movea.l _tl_sprite_init(A5),A1
- jsr (A1) ; Initroutine aufrufen
- lea 20(SP),SP ; Stackkorrectur
- tst.l D0
- rts
- ENDPART
- konvertier_speicher:>PART 'fordert Speicher an'
-
- ; Einsprung: D7 Länge des Speichers, den _alle_ Objekte zusammengezählt für 1 Plane benötigen
- ; D5 x-Ausmaße des größten Objekts samt x-Bewegung
- ; D6 y-Ausmaße des größten Objekts samt y-Bewegung
- ; D3=1 -> Monochrom d3=0 -> Farbig
- ; D4=0 mit Maske D4=1 ohne Maske
- ; A6 varbase
- ; in tl_info Adresse von tl_struct
- ; Aussprung: D0.l Adresse des Speicherblocks (0 -> nicht genügend Speicher), wo die konvertierten Objekte beginnen
- ; in unkonvert(a6) Adresse des Speicherblocks, der zur Konvertierung benötigt wird...
- ; in Speicher(a6) Adresse des Speicherblocks für Mfree
- ; in unkonvert_länge(a6) Länge des unkonvert Speichers
-
-
-
- ; Die Routine ruft die Sprite Speicheranforderungsroutine auf, um den Speicher in unkonvert(a6) zu erhalten
-
- ; Einsprung für die tl_sprite_init() Routine:
- ; 4(sp).l Zeiger auf Pufferspeicher
- ; 8(sp).l länge des Pufferspeichers
- ; 12(sp).l Zeiger auf die Objekte struktur
- ; 16(sp).w x-Breite des größten Objekts
- ; 18(sp).w y-Breite des größten Objekts
- ; 20(sp).b Farbig (0) monochrom (1)
- ; 21(sp).b mit restaurieren (0), ohne restaurieren (1)
-
- movem.l D1-A6,-(SP)
- movea.l tl_info(A6),A5
- clr.w -(SP) ; mit restaurieren
- move.w D3,-(SP) ; monochrom oder Farbig
- move.w D6,-(SP) ; y-Ausmaße
- move.w D5,-(SP) ; x-Ausmaße
- clr.l -(SP) ; Wert egal
- clr.l -(SP) ; nachfragen, wieviel Speicher überhaupt benötigt wird
- clr.l -(SP)
- movea.l _tl_sprite_init(A5),A1
- jsr (A1) ; Initroutine aufrufen
- lea 20(SP),SP ; Stackkorrectur
- move.w D5,D1 ; breite
- move.w D6,D2 ; höhe
- lsr.w #3,D1 ; in Bytes
- muls D2,D1 ; D1 Anzahl der Bytes
- lsl.l #2,D1 ; mal 4 Planes (in der Regel sind die Bilder mit 16 Farben=4 Planes gemalt)
- cmp.l D1,D0 ; was braucht mehr Speicher? Spriteroutine oder das Initialisieren?
- bge.s convert_speich_1 ; wenn die Spriteroutine mehr Speicher braucht (mehr Bitplanes z.b true color)
- move.l D1,D0 ; Zum Laden braucht man mehr Speicher (z.B. in Monochrom)
- convert_speich_1:move.l D0,unkonvert_länge(A6) ; länge des Speichers
- move.l D7,D6
- tst.w D3 ; monochrom oder in Farbe?
- bne.s convert_speich_2 ; bei Monochrom nicht mit den Planes multiplizieren
- muls _planes(A5),D7 ; D7 nun länge des gesamten Speichers der Bilder (konvertiert)
- convert_speich_2:add.l D7,D0 ; D0 nun gesammte Länge des benötigten Speichers
- tst.w D4 ; mit Maske? (-> <>0)
- bne.s convert_sp_3
- add.l D6,D0 ; nochmal Länge für 1 Plane dazu für Maske
- convert_sp_3: addq.l #1,D0 ; damit immer eine gerade Zahl von Bytes da ist
- and.l #$FFFFFFFE,D0 ; gerade machen
- move.l D0,-(SP) ; Speicher für alle Objekte
- move.w #Malloc,-(SP) ;
- trap #1
- addq.l #6,SP
- tst.l D0 ; gab es genügend Speicher
- beq.s convert_speich_ausspr ; nein
- move.l D0,speicher(A6)
- move.l D0,unkonvert(A6) ; Adresse eintragen
- movea.l D0,A2 ; Adresse des unkonvertierten Blocks
- move.l unkonvert_länge(A6),D7 ; länge des unkonvertier-Blocks
- add.l D7,D0 ; D0 nun adresse, wo die Konvertierten Objekte anfangen können
- tst.l D0
- convert_speich_ausspr:movem.l (SP)+,D1-A6
- rts
-
-
- ENDPART
-
- konvert_objekt: >PART 'lädt und konvertiert Objekt'
- ; Einsprung: A2 Zeiger auf Speicher, wohin das Objekt konvertiert wird
- ; D5 Breite des Objekts in Pixel (vielfaches von 16)
- ; D6 Höhe des Objekts in Pixel
- ; D3=0 -> Farbig 1 -> Monochrom
- ; D1 offset in der Datei
- ; Aussprung: A2 Zeiger hinter das Objekt
- ; D1 Zeiger hinter das Objekt in der Datei
- ; D0 Zeiger auf Speicher, wohin Konvertiert wurde
-
- move.l A2,D0 ; D0 Startadresse
- movem.l D0/D2-A1/A3-A6,-(SP)
- bsr unkonvert_löschen
- movea.l tl_info(A6),A5
- movea.l unkonvert(A6),A3 ; wohin geladen wird
- move.w D5,D0
- lsr.w #3,D0 ; Anzahl der Bytes
- muls D6,D0 ; Gesamtzahl eines Planes
- lsl.l #2,D0 ; mal 4 Planes (bei 16 Farb Objekten)
- bsr bload ; lädt das Objekt
- movea.l unkonvert(A6),A3
- bsr convert ; konvertiert es (oder dithert es, abhängig von D3)
- movea.l _tl_check(A5),A5 ; tl_check aufrufen
- jsr (A5)
- bmi ende ; und bei bedarf raus
- movem.l (SP)+,D0/D2-A1/A3-A6
- rts
-
- ENDPART
-
- create_mask: >PART 'errechnet eine Maske'
- ; Einsprung: A2 Wohin die Maske kommt
- ; unkonvert(a6) Zeiger auf Planes im Standartformat
- ; D5 Breite des Objekts in Pixel
- ; D6 Höhe des Objekts in Pixel
- ; Aussprung: A2 Zeigt hinter die Maske
- ; D0 Adresse, wo die Maske steht
- ; Das unkonvert Feld bleibt unberührt
-
- move.l A2,D0
- movem.l D0-A1/A3-A6,-(SP)
- move.w D5,D7
- lsr.w #4,D7 ; anzahl der Wörter in x
- muls D6,D7 ; d7 offset zweier Planes
- move.l D7,D0
- add.l D0,D0
- movea.l unkonvert(A6),A3
- movea.l A3,A0 ; a0/a1/a3/a4 Zeigen auf die einzelnen Planes
- adda.l D0,A0
- movea.l A0,A1
- adda.l D0,A1
- movea.l A1,A4
- adda.l D0,A4
- move.l D7,D1 ; Schleifenzähler
- c_m_schl1: move.w (A0)+,D0
- or.w (A1)+,D0
- or.w (A3)+,D0
- or.w (A4)+,D0 ; Maske aus 4 Planes aufgebaut
- move.w D0,(A2)+ ; und Eintragen
- subq.w #1,D1
- bne.s c_m_schl1
- movea.l tl_check(A6),A0
- jsr (A0)
- movem.l (SP)+,D0-A1/A3-A6
- rts
- ENDPART
- spiegel_objekt: >PART 'spiegelt und konvertiert Obj.'
- ; Einsprung: in Unkonvert stehen die Pixeldaten
- ; A2 Zeiger auf Speicher, wohin das Objekt konvertiert wird
- ; D5 Breite des Objekts in Pixel (vielfaches von 16)
- ; D6 Höhe des Objekts in Pixel
- ; D3=0 -> Farbig 1 -> Monochrom
- ; Aussprung: A2 Zeiger hinter das Objekt
- ; D0 Zeiger, wo das Objekt steht
-
- move.l A2,D0
- movem.l D0-A6,-(SP)
- movea.l tl_info(A6),A5
- move.w D5,D0
- lsr.w #4,D0 ; Breite in Words
- movea.l unkonvert(A6),A0 ; Unkonvertierte Pixeldaten
- lea spiegel_puffer(PC),A2 ; dorthin wird zwischengespiegelt
- adda.w D0,A2
- adda.w D0,A2 ; Zeigt ans Ende
- subq.w #1,D0 ; wegen DBRA
- subq.w #1,D6 ; wegen DBRA
- moveq #4-1,D4 ; 4 Planes
- spiegel_planes: move.w D6,-(SP) ; Höhe puffern
- spiegel_loop3: move.w D0,D5 ; Breite in Words-1 Schleife pro Zeile
- movea.l A0,A1
- spiegel_loop1: move.w (A1)+,D1
-
- REPT 16 ; 16 mal machen
-
- lsl.w #1,D1 ; Oberstes Bit ins x-Bit schiften
- roxr.w #1,D7 ; von Oben reinrotieren dadurch wird es umgedreht
-
- ENDR
-
- move.w D7,-(A2) ; zurückschreiben
- dbra D5,spiegel_loop1
- move.w D0,D5 ; Breite in Words
- spiegel_loop2: move.w (A2)+,(A0)+ ; Zeile übertragen
- dbra D5,spiegel_loop2
- dbra D6,spiegel_loop3
- move.w (SP)+,D6
- dbra D4,spiegel_planes ; 4 mal das ganze
- movea.l tl_check(A6),A0
- jsr (A0)
- bmi ende
- movem.l (SP)+,D0-A6
- bsr.s convert ; und konvertieren
- rts
-
- spiegel_puffer: DS.B 40 ; maximale Breite sind 320 Pixel (beliebig erweiterbar)
-
- ENDPART
-
- convert: >PART 'Konvertiere Objekt'
- ; Eingaben: A2: zieladresse (genügend reservieren!!!)
- ; D5: Breite des Objekts in Pixel
- ; D6: Höhe des Objekts in Pxel
- ; D3: 0-> Farbe (wenn möglich) 1-> Monochrom
- ; in unkonvert sind die unkonvertierten Pixeldaten
- ; dither_tabelle ist die Tabelle mit den Ditherfarbumrechnungszeug
- ; Aussprung: A2 zeigt auf die nächste Adresse
-
- movem.l D0-A1/A3-A6,-(SP)
- movea.l tl_info(A6),A5 ; Zeiger auf die tl_info-struktur
-
- tst.w D_sw ; Wurde im Dialog auf sw gestellt?
- bne.s dithern ; monochrom
-
- pea dither_tabelle(PC)
- move.w #16,-(SP) ; Elefanten haben 16 Farben
-
- lea farbpaletten(PC),A0
- move.w D_farbe(PC),D0 ; welche Farbe wurde in den Einstellungen ausgewählt
- subq.w #1,D0
- lsl.w #2,D0
- move.l 0(A0,D0.w),-(SP) ; Zeiger auf die Farbtabelle
-
- move.w #4,-(SP) ; Die Flederfanten haben 4 Planes
- move.w D6,-(SP) ; Höhe eines Flederfanten
- move.w D5,-(SP) ; Breite eines Flederfanten
- move.l A2,-(SP) ; Zieladresse
- move.l unkonvert(A6),-(SP)
- movea.l _tl_convert(A5),A0
- jsr (A0) ; tl_convert()
- lea 24(SP),SP ; Stackkorrektur
- movea.l D0,A2 ; wohin die Nächste Phase konvertiert wird
- bmi ende ; wenn D0<0 gab's einen Fehler, also raus
- movem.l (SP)+,D0-A1/A3-A6
- rts
-
-
- dithern: move.l unkonvert(A6),-(SP) ; tl_dither: Spriteadr
- move.l A2,-(SP) ; Zieladr
- pea dither_tabelle(A6) ; Farbumrechnunxtabelle
- move.w D5,-(SP) ; breite
- move.w D6,-(SP) ; höhe
- move.w #4,-(SP) ; planes
-
- movea.l tl_dither(A6),A1
- jsr (A1)
- bmi ende ; wärendessen aufgewacht
- lea 18(SP),SP
- lsr.w #3,D5 ; anzahl der Bytes in x
- muls D6,D5 ; Anzahl der Bytes in einem Plane
- adda.l D5,A2 ; neue Adresse
- movem.l (SP)+,D0-A1/A3-A6
- rts
-
-
- ENDPART
-
- unkonvert_löschen:>PART 'löscht gesamten unkonvert teil'
- ; Einsprung: nichts
- ; Aussprung: nichts
-
- movem.l D7-A0,-(SP)
- movea.l unkonvert(A6),A0
- move.l unkonvert_länge(A6),D7
- asr.l #1,D7
- convert_lösch_1:clr.w (A0)+
- subq.w #1,D7
- bne.s convert_lösch_1
- movem.l (SP)+,D7-A0
- rts
- ENDPART
- load_mask: >PART 'lädt eine Maske rein'
- ; Einsprung: A2 Wohin die Maske kommt
- ; D1 offset in der Datei
- ; D5 Breite in Pixel
- ; D6 Höhe in Pixel
-
- movem.l D0/D2-A1/A3-A6,-(SP)
- movea.l A2,A3 ;
- move.w D5,D0
- lsr.w #3,D0 ; Anzahl der Bytes
- muls D6,D0 ; Gesamtzahl eines Planes
- add.l D0,D1
- bsr.s bload ; lädt das Objekt
- movem.l (SP)+,D0/D2-A1/A3-A6
- rts
- ENDPART
- bload: >PART 'Block-Load'
- ; Eingaben: D0: zu ladende Bytes
- ; D1: Ab Byte D1 laden
- ; A3: Startadresse
- ; in Datei Zeiger auf vollständigen Dateinnamen mit Pfad
- ; Ausgaben: D1 position des nächsten Objekts in der Datei
- ;
- movem.l D0/D2-A6,-(SP)
- move.l D0,D6 ; Länge sichern
- move.l D1,D5
- clr.w -(SP) ; Fopen: nur lesen
-
- move.l datei(A6),-(SP) ; Zeiger auf Dateinamen
- move.w #Fopen,-(SP)
- trap #1
- addq.l #8,SP
- move.w D0,D7 ; Handle kopieren und gleichzeitig testen.
- bmi.s datei_nicht_da ; Fehler: dann zurück
-
- clr.w -(SP) ; Fseek: ab Dateistart
- move.w D7,-(SP) ; Handle
- move.l D5,-(SP) ; Offset
- move.w #Fseek,-(SP) ; Opcode
- trap #1
- lea $0A(SP),SP
-
- add.l D6,D5 ; neuer offset in der Datei
-
- move.l A3,-(SP) ; Fread: Adresse...
- move.l D6,-(SP) ; Anzahl der zu lesenden Bytes...
- move.w D7,-(SP) ; handle
- move.w #Fread,-(SP)
- trap #1
- lea $0C(SP),SP
-
-
- move.w D7,-(SP) ; Fclose: handle
- move.w #Fclose,-(SP)
- trap #1
- addq.l #4,SP
- move.l D5,D1 ; neuer offset
- moveq #0,D0 ; n-Flag löschen
- bload_rts: movem.l (SP)+,D0/D2-A6
- rts
-
- datei_nicht_da: movea.l tl_info(A6),A5
- movea.l _tl_scroll(A5),A5
- pea datei_txt(PC)
- move.w #2,-(SP) ; 2 mal
- jsr (A5)
- bra ende ; und Raus aus dem Modul
-
-
- ENDPART
- datei_pfad: >PART 'bastelt Vollständigen Namen'
- ; Einsprung: A1 Zeiger auf den Dateinamen
- ; Aussprung: in datei(a6) Zeiger auf den vollständigen Dateinamen
-
- movem.l D0-A6,-(SP)
- movea.l tl_info(A6),A5
- movea.l _tl_path(A5),A2 ; Zeiger auf Pfadnamen
- move.l A2,datei(A6) ; Zeiger eintragen
- move.w -2(A2),D0 ; länge des Dateipfads
- lea 0(A2,D0.w),A3
- pfad_schl: move.b (A1)+,(A3)+
- bne.s pfad_schl
- movem.l (SP)+,D0-A6
- rts
-
- ENDPART
-
- ;-----------------------------------------------------------------
-
-
-
- >PART 'VDI-Library'
- ;************************************************************************
- ;* Und das gleiche nochmal für die VDI-Funktionen *
- ;* D0 = Die Eingabeparameter *
- ;* Bit 24-31 = Opcode der Funktion *
- ;* Bit 16-23 = Länge des Intin-Arrays *
- ;* Bit 8-15 = Identifikationsnummer für Unter-Opcodes *
- ;* Bit 0-7 = Anzahl der Einträge in ptsin *
- ;* Die Gerätekennung wird der Variable "gr_handle" entnommen. *
- ;************************************************************************
- _vdi: movem.l D1-A6,-(SP)
- lea control+2(A6),A0
- clr.w (A0)+ ;alle Parameter löschen
- clr.l (A0)+
- clr.w (A0)
- move.l D0,-(SP)
- tst.b (SP) ;kein Opcode vorhanden? => Kurzformat
- addq.l #4,SP
- bne.s _vdi1
- move.b D0,1-8(A0) ;Funktionsnummer in den Bits 0-7
- bra.s _vdi2 ;alle anderen Parameter sind 0!
- _vdi1: move.b D0,3-8(A0) ;Anzahl der Einträge in ptsin
- lsr.w #8,D0
- move.w D0,10-8(A0) ;Unter-Opcode
- swap D0
- move.b D0,7-8(A0) ;Anzahl der Einträge in intin
- lsr.w #8,D0
- move.w D0,0-8(A0) ;Funktionsnummer
- _vdi2: move.w vdi_handle(A6),12-8(A0) ;VDI-Handle
- lea _vdi_pb(A6),A0
- move.l A0,D1
- moveq #$73,D0
- trap #2
- moveq #0,D0
- move.w int_out(A6),D0 ;int_out[0]
- movem.l (SP)+,D1-A6
- rts
-
- _vdi_pb: DC.L control ; Der VDI-Parameterblock
- DC.L int_in
- DC.L ptsin
- DC.L int_out
- DC.L ptsout
- ENDPART
-
- DATA
-
-
- >PART 'objekt daten'
-
-
- flederfant: DC.W b_e1,h_e1 ; Ausmaße
- DC.W 7-1 ; 7 Animationsstufen
- DS.L 7*2 ; Zeiger auf konvertiere Pixeldaten
-
-
- ENDPART
-
- grau: >PART
- DC.W 0,0,0
- DC.W 142,142,142
- DC.W 285,285,285
- DC.W 428,428,428
- DC.W 571,571,571
- DC.W 714,714,714
- DC.W 857,857,857
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
- lila: >PART
- DC.W 0,0,0
- DC.W 285,142,285
- DC.W 428,285,428
- DC.W 571,428,571
- DC.W 714,571,714
- DC.W 857,714,857
- DC.W 1000,857,1000
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
- blau: >PART
- DC.W 0,0,0
- DC.W 0,0,285
- DC.W 0,142,428
- DC.W 0,285,571
- DC.W 0,428,714
- DC.W 0,571,857
- DC.W 571,714,1000
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
- rosa: >PART
- DC.W 0,0,0
- DC.W 285,0,142
- DC.W 428,142,285
- DC.W 571,285,428
- DC.W 714,428,571
- DC.W 857,571,714
- DC.W 1000,714,857
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
- grün: >PART
- DC.W 0,0,0
- DC.W 0,285,0
- DC.W 142,428,142
- DC.W 285,571,285
- DC.W 428,714,428
- DC.W 571,857,571
- DC.W 714,1000,714
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
-
- ENDPART
- gelb: >PART
- DC.W 0,0,0
- DC.W 285,285,0
- DC.W 428,428,0
- DC.W 571,571,0
- DC.W 714,714,142
- DC.W 857,857,428
- DC.W 1000,1000,714
- DC.W 1000,1000,1000
- DC.W 1000,1000,857
- DC.W 857,857,714
- DC.W 714,714,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
- violett: >PART
- DC.W 0,0,0
- DC.W 285,0,285
- DC.W 428,0,428
- DC.W 571,0,571
- DC.W 714,0,714
- DC.W 857,142,857
- DC.W 1000,285,1000
- DC.W 1000,571,1000
- DC.W 1000,571,857
- DC.W 1000,571,714
- DC.W 1000,428,571
- DC.W 571,571,571
- DC.W 428,428,428
- DC.W 285,285,285
- DC.W 857,0,0
- DC.W 1000,0,0
- ENDPART
-
-
- >PART 'Daten'
-
-
- bilder_pfad: DC.B 'daten\elefant.000',0
- datei_txt: DC.B 'Flederfanten benötigen im Ordner ''\TLM\DATEN\'' die Datei ''ELEFANT.000'', sonst fliegen sie nicht... ',0
-
- EVEN
-
- ENDPART
-
-
- dither_tabelle: DC.W 0 ; 0
- DC.W 0 ; 1
- DC.W 3 ; 2
- DC.W 6 ; 3
- DC.W 7 ; 4
- DC.W 8 ; 5
- DC.W 9 ; 6
- DC.W 13 ; 7
- DC.W 16 ; 8
- DC.W 16 ; 9
- DC.W 13 ; 10
- DC.W 0 ; 11
- DC.W 0 ; 12
- DC.W 0 ; 13
- DC.W 0 ; 14
- DC.W 0 ; 15
-
-
-
- BSS
- RSBSS
- varbase: DS.L 1
-
-
- >PART 'Variablen'
- tl_info: DS.L 1 ; Die Adressen der jeweiligen TwiLight-Struktur/Routinen
- tl_check: DS.L 1
- tl_sprite: DS.L 1
- tl_dither: DS.L 1
- vscr_x: DS.W 1
- vscr_y: DS.W 1
- vscr_w: DS.W 1
- vscr_h: DS.W 1
- max_colors: DS.W 1 ; Anzahl der Farben
-
- stackpointer: DS.L 1 ; Speicher für Stackpointer
- unkonvert: DS.L 1 ; Adressen der Speicherblöcke
- unkonvert_länge:DS.L 1 ; länge des unkonvert Blocks
- speicher: DS.L 1 ; anfangsadresse des reservierten Speichers
- darstell_planes:DS.W 1 ; wieviele Planes dargestellt werden
- datei: DS.L 1 ; Zeiger auf den Pfad mit Datei
- unMFDB: DS.W 20
- z_MFDB: DS.W 20
-
-
- ENDPART
- >PART 'modulvariablen'
-
- anz_objekte: DS.W 1 ; wieviele Objekte-1 erscheinen sollen
- objekte_array: DS.W 1
- DS.L 30+2 ; 30 Objekte +2 Sicherheit...
- sprite_daten: DS.W 11 ; Ein Objekt ist 10+1 Wörter Lang
- DS.W 11*30 ; maximal 30 Objekte gleichzeitig
- ob_tree: DS.L 33 ; Objektbaum mit Platz für 33 Objekte
-
-
-
- ENDPART
- >PART 'VDI-Lib BSS'
-
- control: DS.W 16
- int_in: DS.W 128
- int_out: DS.W 128
- ptsin: DS.W 128
- ptsout: DS.W 128
- vdi_handle: DS.W 1 ;Die Handle der TwiLight-Workstation
-
- ENDPART
- END
-